React์ useMemo ํ ์ ๋ง์คํฐํ์ฌ ๊ณ ๋น์ฉ ๊ณ์ฐ์ ์บ์ฑํ๊ณ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ์ธ์. React ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋์ ํจ์จ์ฑ์ ํฅ์์ํค์ธ์.
React useMemo: ๋ฉ๋ชจ์ด์ ์ด์ ์ผ๋ก ์ฑ๋ฅ ์ต์ ํํ๊ธฐ
React ๊ฐ๋ฐ ์ธ๊ณ์์ ์ฑ๋ฅ์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๋ ๊ฒ์ด ์ ์ ๋ ์ค์ํด์ง๊ณ ์์ต๋๋ค. React์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ ์ค ํ๋๋ useMemo ํ
์
๋๋ค. ์ด ํ
์ ์ฌ์ฉํ๋ฉด ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์์ด์ฆ(memoize)ํ๊ฑฐ๋ ์บ์(cache)ํ์ฌ ๋ถํ์ํ ์ฌ๊ณ์ฐ์ ๋ฐฉ์งํ๊ณ ์ ํ๋ฆฌ์ผ์ด์
์ ํจ์จ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๋ฉ๋ชจ์ด์ ์ด์ (Memoization) ์ดํดํ๊ธฐ
ํต์ฌ์ ์ผ๋ก ๋ฉ๋ชจ์ด์ ์ด์ ์ ๋น์ฉ์ด ๋ง์ด ๋๋ ํจ์ ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ ๋์ผํ ์ ๋ ฅ์ด ๋ค์ ๋ฐ์ํ์ ๋ ์บ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ฌ ํจ์๋ฅผ ์ต์ ํํ๋ ๊ธฐ๋ฒ์ ๋๋ค. ํจ์๋ ๊ณ์ฐ์ ๋ฐ๋ณต์ ์ผ๋ก ์ํํ๋ ๋์ ์ด์ ์ ๊ณ์ฐ๋ ๊ฐ์ ๊ฐ๋จํ ๊ฒ์ํฉ๋๋ค. ์ด๋ ํนํ ๋ณต์กํ ๊ณ์ฐ์ด๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ๋ค๋ฃฐ ๋ ํจ์ ์คํ์ ํ์ํ ์๊ฐ๊ณผ ๋ฆฌ์์ค๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
์ซ์์ ํฉํ ๋ฆฌ์ผ์ ๊ณ์ฐํ๋ ํจ์๊ฐ ์๋ค๊ณ ์์ํด ๋ณด์ธ์. ํฐ ์์ ํฉํ ๋ฆฌ์ผ์ ๊ณ์ฐํ๋ ๊ฒ์ ๊ณ์ฐ ์ง์ฝ์ ์ผ ์ ์์ต๋๋ค. ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ด๋ฏธ ๊ณ์ฐ๋ ๊ฐ ์ซ์์ ํฉํ ๋ฆฌ์ผ์ ์ ์ฅํจ์ผ๋ก์จ ๋์์ ์ค ์ ์์ต๋๋ค. ๋ค์์ ๊ฐ์ ์ซ์๋ก ํจ์๊ฐ ํธ์ถ๋๋ฉด, ๋ค์ ๊ณ์ฐํ๋ ๋์ ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๋จํ ๊ฒ์ํ ์ ์์ต๋๋ค.
React useMemo ์๊ฐ
React์ useMemo ํ
์ ํจ์ํ ์ปดํฌ๋ํธ ๋ด์์ ๊ฐ์ ๋ฉ๋ชจ์์ด์ฆํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด ํ
์ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค:
- ๊ณ์ฐ์ ์ํํ๋ ํจ์.
- ์์กด์ฑ ๋ฐฐ์ด.
useMemo ํ
์ ์์กด์ฑ ๋ฐฐ์ด์ ์์กด์ฑ ์ค ํ๋๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ํจ์๋ฅผ ๋ค์ ์คํํฉ๋๋ค. ์์กด์ฑ์ด ๋์ผํ๊ฒ ์ ์ง๋๋ฉด ์ด์ ๋ ๋๋ง์์ ์บ์๋ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด๋ ํจ์๊ฐ ๋ถํ์ํ๊ฒ ์คํ๋๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ ํนํ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ์ ์ฒ๋ฆฌํ ๋ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
useMemo์ ๊ตฌ๋ฌธ
useMemo์ ๊ตฌ๋ฌธ์ ๊ฐ๋จํฉ๋๋ค:
const memoizedValue = useMemo(() => {
// ์ฌ๊ธฐ์ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ
return computeExpensiveValue(a, b);
}, [a, b]);
์ด ์์ ์์ computeExpensiveValue(a, b)๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ์ ์ํํ๋ ํจ์์
๋๋ค. ๋ฐฐ์ด [a, b]๋ ์์กด์ฑ์ ์ง์ ํฉ๋๋ค. useMemo ํ
์ a ๋๋ b๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ง computeExpensiveValue ํจ์๋ฅผ ๋ค์ ์คํํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด์ ๋ ๋๋ง์์ ์บ์๋ ๊ฐ์ ๋ฐํํฉ๋๋ค.
useMemo๋ ์ธ์ ์ฌ์ฉํด์ผ ํ ๊น์?
useMemo๋ ๋ค์๊ณผ ๊ฐ์ ์๋๋ฆฌ์ค์์ ๊ฐ์ฅ ์ ์ฉํฉ๋๋ค:
- ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ: ๋ณต์กํ ๋ฐ์ดํฐ ๋ณํ์ด๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ํํฐ๋ง๊ณผ ๊ฐ์ด ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ์ํํ๋ ํจ์๊ฐ ์์ ๋.
- ์ฐธ์กฐ ๋๋ฑ์ฑ ๊ฒ์ฌ: ํนํ
React.memo๋ฅผ ์ฌ์ฉํ๋ ์์ ์ปดํฌ๋ํธ์ ๊ฐ์ props๋ก ์ ๋ฌํ ๋, ๊ธฐ๋ณธ ์์กด์ฑ์ด ๋ณ๊ฒฝ๋ ๋๋ง ๊ฐ์ด ๋ณ๊ฒฝ๋๋๋ก ๋ณด์ฅํด์ผ ํ ๋. - ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ๋ฐฉ์ง: props๋ ์ํ๊ฐ ์ค์ ๋ก ๋ณ๊ฒฝ๋์ง ์๋ ํ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์ถ์ ๋.
์ด๋ฌํ ๊ฐ ์๋๋ฆฌ์ค๋ฅผ ์ค์ ์์ ์ ํจ๊ป ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์๋๋ฆฌ์ค 1: ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ
ํน์ ๊ธฐ์ค์ ๋ฐ๋ผ ๋๊ท๋ชจ ์ฌ์ฉ์ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ํํฐ๋งํด์ผ ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ธ์. ๋๊ท๋ชจ ๋ฐฐ์ด์ ํํฐ๋งํ๋ ๊ฒ์ ํนํ ํํฐ๋ง ๋ก์ง์ด ๋ณต์กํ ๊ฒฝ์ฐ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด๋ค ์ ์์ต๋๋ค.
const UserList = ({ users, filter }) => {
const filteredUsers = useMemo(() => {
console.log('์ฌ์ฉ์ ํํฐ๋ง ์ค...'); // ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ ์๋ฎฌ๋ ์ด์
return users.filter(user => user.name.toLowerCase().includes(filter.toLowerCase()));
}, [users, filter]);
return (
{filteredUsers.map(user => (
- {user.name}
))}
);
};
์ด ์์ ์์ filteredUsers ๋ณ์๋ useMemo๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ์์ด์ฆ๋ฉ๋๋ค. ํํฐ๋ง ๋ก์ง์ users ๋ฐฐ์ด์ด๋ filter ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง ๋ค์ ์คํ๋ฉ๋๋ค. ๋ง์ฝ users ๋ฐฐ์ด๊ณผ filter ๊ฐ์ด ๋์ผํ๊ฒ ์ ์ง๋๋ฉด, useMemo ํ
์ ์บ์๋ filteredUsers ๋ฐฐ์ด์ ๋ฐํํ์ฌ ํํฐ๋ง ๋ก์ง์ด ๋ถํ์ํ๊ฒ ๋ค์ ์คํ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
์๋๋ฆฌ์ค 2: ์ฐธ์กฐ ๋๋ฑ์ฑ ๊ฒ์ฌ
React.memo๋ฅผ ์ฌ์ฉํ๋ ์์ ์ปดํฌ๋ํธ์ ๊ฐ์ props๋ก ์ ๋ฌํ ๋, props๊ฐ ๊ทธ๋ค์ ๊ธฐ๋ณธ ์์กด์ฑ์ด ๋ณ๊ฒฝ๋ ๋๋ง ๋ณ๊ฒฝ๋๋๋ก ๋ณด์ฅํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด, ํ์ํ๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ ์์ ์ปดํฌ๋ํธ๊ฐ ๋ถํ์ํ๊ฒ ๋ฆฌ๋ ๋๋ง๋ ์ ์์ต๋๋ค.
const MyComponent = React.memo(({ data }) => {
console.log('MyComponent ๋ฆฌ๋ ๋๋ง๋จ!');
return {data.value};
});
const ParentComponent = () => {
const [a, setA] = React.useState(1);
const [b, setB] = React.useState(2);
const data = useMemo(() => ({
value: a + b,
}), [a, b]);
return (
);
};
์ด ์์ ์์ data ๊ฐ์ฒด๋ useMemo๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ์์ด์ฆ๋ฉ๋๋ค. React.memo๋ก ๊ฐ์ธ์ง MyComponent ์ปดํฌ๋ํธ๋ data prop์ด ๋ณ๊ฒฝ๋ ๋๋ง ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค. data๊ฐ ๋ฉ๋ชจ์์ด์ฆ๋์๊ธฐ ๋๋ฌธ์, a ๋๋ b๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ๋ณ๊ฒฝ๋ฉ๋๋ค. useMemo๊ฐ ์๋ค๋ฉด ParentComponent๊ฐ ๋ ๋๋ง๋ ๋๋ง๋ค ์๋ก์ด data ๊ฐ์ฒด๊ฐ ์์ฑ๋์ด, a + b์ value๊ฐ ๋์ผํ๊ฒ ์ ์ง๋๋๋ผ๋ MyComponent๊ฐ ๋ถํ์ํ๊ฒ ๋ฆฌ๋ ๋๋ง๋ ๊ฒ์
๋๋ค.
์๋๋ฆฌ์ค 3: ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ๋ฐฉ์ง
๋๋ก๋ props๋ ์ํ๊ฐ ์ค์ ๋ก ๋ณ๊ฒฝ๋์ง ์๋ ํ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์ถ์ ์ ์์ต๋๋ค. ์ด๋ ๋ง์ ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง ๋ณต์กํ ์ปดํฌ๋ํธ์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ํนํ ์ ์ฉํ ์ ์์ต๋๋ค.
const MyComponent = ({ config }) => {
const processedConfig = useMemo(() => {
// config ๊ฐ์ฒด ์ฒ๋ฆฌ (๋น์ฉ์ด ๋ง์ด ๋๋ ์์
)
console.log('config ์ฒ๋ฆฌ ์ค...');
let result = {...config}; // ๊ฐ๋จํ ์์ ์ด์ง๋ง ๋ณต์กํ ์ ์์
if (result.theme === 'dark') {
result.textColor = 'white';
} else {
result.textColor = 'black';
}
return result;
}, [config]);
return (
{processedConfig.title}
{processedConfig.description}
);
};
const App = () => {
const [theme, setTheme] = React.useState('light');
const config = useMemo(() => ({
title: '๋ด ์ฑ',
description: '์ด๊ฒ์ ์ํ ์ฑ์
๋๋ค.',
theme: theme
}), [theme]);
return (
);
};
์ด ์์ ์์ processedConfig ๊ฐ์ฒด๋ config prop์ ๊ธฐ๋ฐ์ผ๋ก ๋ฉ๋ชจ์์ด์ฆ๋ฉ๋๋ค. ๋น์ฉ์ด ๋ง์ด ๋๋ config ์ฒ๋ฆฌ ๋ก์ง์ config ๊ฐ์ฒด ์์ฒด๊ฐ ๋ณ๊ฒฝ๋ ๋(์ฆ, ํ
๋ง๊ฐ ๋ณ๊ฒฝ๋ ๋)๋ง ์คํ๋ฉ๋๋ค. ๊ฒฐ์ ์ ์ผ๋ก, `App` ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค `App` ์ปดํฌ๋ํธ์์ `config` ๊ฐ์ฒด๊ฐ ์ฌ์ ์๋๋๋ผ๋, `useMemo`๋ฅผ ์ฌ์ฉํ๋ฉด `config` ๊ฐ์ฒด๋ `theme` ๋ณ์ ์์ฒด๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ์ค์ ๋ก *๋ณ๊ฒฝ*๋ฉ๋๋ค. `App` ์ปดํฌ๋ํธ์์ `useMemo` ํ
์ด ์๋ค๋ฉด `App`์ด ๋ ๋๋ง๋ ๋๋ง๋ค ์๋ก์ด `config` ๊ฐ์ฒด๊ฐ ์์ฑ๋์ด, ๊ธฐ๋ณธ ๋ฐ์ดํฐ(ํ
๋ง)๊ฐ ์ค์ ๋ก ๋์ผํ๋๋ผ๋ `MyComponent`๊ฐ ๋งค๋ฒ `processedConfig`๋ฅผ ๋ค์ ๊ณ์ฐํ๊ฒ ๋ ๊ฒ์
๋๋ค.
ํผํด์ผ ํ ์ผ๋ฐ์ ์ธ ์ค์
useMemo๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ์ ์คํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. useMemo๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ์์ด์ฆ๋ ๊ฐ์ ๊ด๋ฆฌํ๋ ์ค๋ฒํค๋๊ฐ ์ฌ๊ณ์ฐ์ ํผํ๋ ์ด์ ๋ณด๋ค ์ปค์ ธ ์คํ๋ ค ์ฑ๋ฅ์ ์ ํ์ํฌ ์ ์์ต๋๋ค.
- ๊ณผ๋ํ ๋ฉ๋ชจ์ด์ ์ด์ : ๋ชจ๋ ๊ฒ์ ๋ฉ๋ชจ์์ด์ฆํ์ง ๋ง์ธ์! ๊ณ์ฐ ๋น์ฉ์ด ์ ๋ง ๋ง์ด ๋ค๊ฑฐ๋ ์ฐธ์กฐ ๋๋ฑ์ฑ ๊ฒ์ฌ์ ์ฌ์ฉ๋๋ ๊ฐ๋ง ๋ฉ๋ชจ์์ด์ฆํ์ธ์.
- ๋ถ์ ํํ ์์กด์ฑ: ํจ์๊ฐ ์์กดํ๋ ๋ชจ๋ ์์กด์ฑ์ ์์กด์ฑ ๋ฐฐ์ด์ ํฌํจ์์ผ์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฉ๋ชจ์์ด์ฆ๋ ๊ฐ์ด ์ค๋๋ ๊ฐ์ด ๋์ด ์๊ธฐ์น ์์ ๋์์ ์ ๋ฐํ ์ ์์ต๋๋ค.
- ์์กด์ฑ ๋๋ฝ: ์์กด์ฑ์ ์์ด๋ฒ๋ฆฌ๋ฉด ์ถ์ ํ๊ธฐ ์ด๋ ค์ด ๋ฏธ๋ฌํ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์์กด์ฑ ๋ฐฐ์ด์ด ์์ ํ์ง ํญ์ ๋ค์ ํ์ธํ์ธ์.
- ์ฑ๊ธํ ์ต์ ํ: ์ฑ๊ธํ๊ฒ ์ต์ ํํ์ง ๋ง์ธ์. ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ํ์ธํ์ ๋๋ง ์ต์ ํํ์ธ์. ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋์ ์ด๋ ๋ถ๋ถ์ด ์ค์ ๋ก ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋์ง ํ์ ํ์ธ์.
useMemo์ ๋์
useMemo๊ฐ ๊ฐ์ ๋ฉ๋ชจ์์ด์ฆํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด๊ธด ํ์ง๋ง, React ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ค๋ฅธ ๊ธฐ๋ฒ๋ค๋ ์์ต๋๋ค.
- React.memo:
React.memo๋ ํจ์ํ ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจ์์ด์ฆํ๋ ๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC)์ ๋๋ค. props๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ํ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ์ด๋ ๋์ผํ props๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋ฐ๋ ์ปดํฌ๋ํธ์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. - PureComponent (ํด๋์ค ์ปดํฌ๋ํธ์ฉ):
React.memo์ ์ ์ฌํ๊ฒ,PureComponent๋ props์ state์ ์์ ๋น๊ต๋ฅผ ์ํํ์ฌ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋์ด์ผ ํ๋์ง ๊ฒฐ์ ํฉ๋๋ค. - ์ฝ๋ ๋ถํ (Code Splitting): ์ฝ๋ ๋ถํ ์ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์์ ๋ฒ๋ค๋ก ๋๋์ด ํ์ํ ๋ ๋ก๋ํ ์ ์์ต๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ๊ฐ์ ํ๊ณ ํ์ฑ ๋ฐ ์คํํด์ผ ํ๋ ์ฝ๋์ ์์ ์ค์ผ ์ ์์ต๋๋ค.
- ๋๋ฐ์ด์ฑ(Debouncing) ๋ฐ ์ค๋กํ๋ง(Throttling): ๋๋ฐ์ด์ฑ๊ณผ ์ค๋กํ๋ง์ ํจ์๊ฐ ์คํ๋๋ ๋น์จ์ ์ ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ธฐ๋ฒ์ ๋๋ค. ์ด๋ ์คํฌ๋กค ํธ๋ค๋ฌ๋ ๋ฆฌ์ฌ์ด์ฆ ํธ๋ค๋ฌ์ ๊ฐ์ด ์์ฃผ ํธ๋ฆฌ๊ฑฐ๋๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
์ ์ธ๊ณ์ ์ค์ ์ ์ฉ ์ฌ๋ก
useMemo๊ฐ ์ ์ธ๊ณ์ ๋ค์ํ ๋งฅ๋ฝ์์ ์ด๋ป๊ฒ ์ ์ฉ๋ ์ ์๋์ง ๋ช ๊ฐ์ง ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- ์ ์์๊ฑฐ๋ (๊ธ๋ก๋ฒ): ๊ธ๋ก๋ฒ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ๋ณต์กํ ์ํ ํํฐ๋ง ๋ฐ ์ ๋ ฌ ์์
์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ๊ธฐ ์ํด
useMemo๋ฅผ ์ฌ์ฉํ์ฌ ์์น๋ ์ธํฐ๋ท ์ฐ๊ฒฐ ์๋์ ๊ด๊ณ์์ด ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋น ๋ฅด๊ณ ๋ฐ์์ฑ์ด ์ข์ ์ผํ ๊ฒฝํ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋์ฟ์ ์ฌ์ฉ์๊ฐ ๊ฐ๊ฒฉ๋์ ์ฌ๊ณ ์ฌ๋ถ๋ก ์ํ์ ํํฐ๋งํ ๋ ๋ฉ๋ชจ์์ด์ฆ๋ ํํฐ๋ง ํจ์์ ์ด์ ์ ๋๋ฆด ์ ์์ต๋๋ค. - ๊ธ์ต ๋์๋ณด๋ (๊ตญ์ ): ์ค์๊ฐ ์ฃผ๊ฐ ๋ฐ ์์ฅ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๊ธ์ต ๋์๋ณด๋๋ ์ด๋ ํ๊ท ์ด๋ ๋ณ๋์ฑ ์ธก์ ๊ณผ ๊ฐ์ ๊ธ์ต ์งํ ๊ด๋ จ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ๊ธฐ ์ํด
useMemo๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ ๋ ๋์๋ณด๋๊ฐ ๋๋ ค์ง๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ๋ฐ๋์ ํธ๋ ์ด๋๊ฐ ์ฃผ์ ์ฑ๊ณผ๋ฅผ ๋ชจ๋ํฐ๋งํ ๋ ๋ ๋ถ๋๋ฌ์ด ์ ๋ฐ์ดํธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. - ์ง๋ ์ ํ๋ฆฌ์ผ์ด์
(์ง์ญ): ์ง๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ์ง๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ง๋ ํฌ์ ๋ฐ ์ขํ ๋ณํ๊ณผ ๊ด๋ จ๋ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ๊ธฐ ์ํด
useMemo๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ํนํ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ด๋ ๋ณต์กํ ์ง๋ ์คํ์ผ์ ๋ค๋ฃฐ ๋ ์ง๋๋ฅผ ํ๋/์ถ์ํ๊ณ ์ด๋ํ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ์๋ง์กด ์ด๋์ฐ๋ฆผ์ ์์ธ ์ง๋๋ฅผ ํ์ํ๋ ์ฌ์ฉ์๋ ๋ ๋น ๋ฅธ ๋ ๋๋ง์ ๊ฒฝํํ ์ ์์ต๋๋ค. - ์ธ์ด ๋ฒ์ญ ์ฑ (๋ค๊ตญ์ด): ๋๋์ ๋ฒ์ญ๋ ํ
์คํธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ํ์ํด์ผ ํ๋ ์ธ์ด ๋ฒ์ญ ์ฑ์ ์์ํด ๋ณด์ธ์.
useMemo๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ ์์ ๋ฐ ๋ ๋๋ง์ ๋ฉ๋ชจ์์ด์ฆํ์ฌ ํ์๋๋ ์ธ์ด์ ๊ด๊ณ์์ด ๋ถ๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ด๋ ์ค๊ตญ์ด๋ ์๋์ด์ ๊ฐ์ด ๋ณต์กํ ๋ฌธ์ ์ฒด๊ณ๋ฅผ ๊ฐ์ง ์ธ์ด์ ํนํ ์ค์ํฉ๋๋ค.
๊ฒฐ๋ก
useMemo ํ
์ React ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ์
๋๋ค. ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ์ ๋ฉ๋ชจ์์ด์ฆํ๊ณ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํจ์ผ๋ก์จ ์ฝ๋์ ์๋์ ํจ์จ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ useMemo๋ฅผ ์ ์คํ๊ฒ ์ฌ์ฉํ๊ณ ๊ทธ ํ๊ณ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. useMemo๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ์ค์ ๋ก๋ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ผ๋ฏ๋ก, ์ฝ๋์์ ์ค์ ๋ก ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๋ถ๋ถ์ ํ์
ํ๊ณ ํด๋น ์์ญ์ ์ต์ ํ ๋
ธ๋ ฅ์ ์ง์คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ฉ๋ชจ์ด์ ์ด์
์ ์๋ฆฌ์ useMemo ํ
์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํดํจ์ผ๋ก์จ, ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ณ ์ฑ๋ฅ React ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ฝ๋๋ฅผ ํ๋กํ์ผ๋งํ๊ณ , ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ฉฐ, ์ต์์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด ์ ๋ต์ ์ผ๋ก useMemo๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.